const {
  first,
  parseInt
} = require('lodash')

// 练习1:使用fp.add(x, y)和fp.map(f, x)创建-个能 让functor里的值增加的函数ex1
const fp = require('lodash/fp')
const {
  Maybe,
  Container
} = require('./support')
let maybe = Maybe.of([5, 6, 1])
let ex1 = (num, functor) => functor.map(fp.map(fp.add(num)))
ex1(6, maybe).map(v => console.log(v))


// 练习2: 实现一个函数ex2，能够使用fp.first获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = functor => functor.map(fp.first)
ex2(xs).map(v => console.log(v))


// 练习3: 实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
  return Maybe.of(o[x])
})
let user = {
  id: 2,
  name: 'Albert'
}
let ex3 = functor => functor.map(fp.first)
ex3(safeProp('name', user)).map(v => console.log(v))


// 练习4: 使用Maybe重写ex4，不要有if语句
// let ex4 = function (n) {
//   if (n) {
//     return parseInt(n);
//   }
// }
let ex4 = n => Maybe.of(n).map(parseInt)
ex4(6.6).map(v => console.log(v))